package com.springboot.jdk.concurrency;

import java.util.concurrent.CyclicBarrier;

/**
 * CyclicBarrier 使用
 *
 * @author: zr
 * @date: 2021-10-08
 */
public class CyclicBarrierDemo {

    public static void main(String[] args) {
        // 我希望有多少个线程执行CountDownLatch 操作=====
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {
            @Override
            public void run() {
                // 在这里里，对结果进行合并
                System.out.println("所有的线程都完成了自己的任何，现在可以合并结果了");
            }
        //    Runnable 不是作为一个线程来执行的，他其实就是一块代码
        //    当所有线程读执行完了 自己的认为之后，就会触发这块代码的执行，不是一个独立的线程
        });

        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("线程1执行自己的一部分工作");
                    cyclicBarrier.await();
                    // 结果合并完毕之后，会继续往下执行
                    System.out.println("最终结果合并完成，线程1可以退出");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("线程2执行自己的一部分工作");
                    cyclicBarrier.await();
                    System.out.println("最终结果合并完成，线程2可以退出");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println("线程3执行自己的一部分工作");
                    cyclicBarrier.await();
                    System.out.println("最终结果合并完成，线程3可以退出");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}
